home *** CD-ROM | disk | FTP | other *** search
/ Aminet 6 / Aminet 6 - June 1995.iso / Aminet / util / shell / axuucp_0_1.lha / axsh / rexx / ax-rmail.rexx < prev    next >
Encoding:
OS/2 REXX Batch file  |  1995-03-22  |  5.0 KB  |  196 lines

  1. /****** axuucp/ax-rmail ******************************************************
  2. *
  3. *   NAME
  4. *    ax-rmail - Sends AXsh mails
  5. *
  6. *   SYNOPSIS
  7. *    rx ax-rmail.rexx < [mbox]
  8. *
  9. *   DESCRIPTION
  10. *
  11. *   NOTES
  12. *    Due to the problem that /bin/mailserver 1.15 is not able to parse
  13. *    RFC 822 address fields correcly.
  14. *    Also: if a mail message to and from an unroutable machine, the mail
  15. *    message will get lost!
  16. *
  17. *   AUTHOR
  18. *    Tobias Ferber <tf@ganymed.hall.sub.org>
  19. *
  20. ******************************************************************************
  21. *
  22. */
  23.  
  24. aka = axconfig('thismachine')
  25. tempfile = "T:ax-rmail." || pragma('Id')
  26. in = 'STDIN'
  27.  
  28. /**/
  29.  
  30. l = readln(in)
  31. fromaddr=''; toaddr=''; state = 'start'
  32.  
  33. do while ~eof(in)
  34.   select
  35.  
  36.     when state = 'start' then do
  37.       if word(l,1)~='From' then do
  38.         say 'From_ expected in line 1'
  39.         exit 20
  40.         end
  41.       else do
  42.         orig = l
  43.         state = 'next'
  44.         end
  45.       end
  46.  
  47.     when state = 'next' then do
  48.       call open('fp',tempfile,'Write')
  49.       call writeln('fp',orig)  /* From_ */
  50.       select
  51.         when upper(left(l,6)) = 'FROM: ' then do; fromaddr= rfcaddr(substr(l,7)); l= "From:" fromaddr; end
  52.         when upper(left(l,4)) = 'TO: '   then do; toaddr= rfcaddr(substr(l,5)); l= "To:" toaddr; end
  53.         when l='' then state='body null'
  54.         otherwise nop
  55.         end
  56.       call writeln('fp',l)
  57.       state = 'header'
  58.       end
  59.  
  60.     when state = 'header' then do
  61.       select
  62.         when upper(left(l,6)) = 'FROM: ' then do; fromaddr= rfcaddr(substr(l,7)); l= "From:" fromaddr; end
  63.         when upper(left(l,4)) = 'TO: '   then do; toaddr= rfcaddr(substr(l,5)); l= "To:" toaddr; end
  64.         when l='' then state='body null'
  65.         otherwise nop
  66.         end
  67.       call writeln('fp',l)
  68.       end
  69.  
  70.     when state = 'body null' then do
  71.       if word(l,1)='From' then do
  72.         orig = l
  73.         state = 'body from'
  74.         end
  75.       else do
  76.         call writeln('fp',l)
  77.         if l~='' then state = 'body nonnull'
  78.         end
  79.       end
  80.  
  81.     when state = 'body from' then do
  82.       if right(word(l,1),1)=':' then do
  83.         call close('fp')
  84.         call mailRFC(tempfile,fromaddr,toaddr)
  85.         address command 'delete quiet' tempfile
  86.         fromaddr=''; toaddr=''
  87.         state = 'have next'
  88.         end
  89.       else do
  90.         call writeln('fp',orig)
  91.         call writeln('fp',l)
  92.         if l='' then state = 'body null'
  93.                 else state = 'body nonull'
  94.         end
  95.       end
  96.  
  97.     when state = 'body nonnull' then do
  98.       call writeln('fp',l)
  99.       if l='' then state = 'body null'
  100.       end
  101.  
  102.     otherwise nop
  103.     end
  104.  
  105.   if state = 'have next' then state = 'next'
  106.                          else l= readln(in)
  107.   end
  108.  
  109. if word(state,1) = 'body' then do
  110.   call close('fp')
  111.   call mailRFC(tempfile,fromaddr,toaddr)
  112.   end
  113.  
  114. if exists(tempfile) then address command 'Delete QUIET "'tempfile'"'
  115.  
  116. exit
  117.  
  118.  
  119. mailRFC: procedure expose aka
  120.   parse arg fname,fromaddr,toaddr
  121.   if words(fromaddr) < 1 then do
  122.     say 'ax-rmail: missing "From:" field (using "postmaster")'
  123.     fromaddr= rfcaddr("postmaster")
  124.     end
  125.   if words(toaddr) < 1 then do
  126.     say 'ax-rmail: missing "To:" field (using "postmaster")'
  127.     to=rfcaddr("postmaster")
  128.     end
  129.   /*if upper(substr(toaddr,pos('@',toaddr)+1)) = upper(aka) then*/
  130.     address command 'AXsh:bin/mailserver "'fname'"'
  131.   /*else
  132.     address command 'Execute UMS:s/MailRFC "'fname'" "'fromaddr'" "'toaddr'"'*/
  133.   return
  134.  
  135.  
  136. /*@<rfcaddr><axconfig>*/
  137.  
  138. /* expects an unfolded RFC 822 header line body, returns the address string or "" */
  139.  
  140. RFCaddr: procedure expose aka
  141.   parse arg str
  142.   str= translate(str,' ',d2c(9))
  143.   if pos('<',str) > 0 then do
  144.     parse var str . "<" str ">"
  145.     if pos(':',str) > 0 then parse var str . ':' str
  146.     end
  147.   else str= word(str,1)
  148.   if pos('@',str) < 1 then str= str'@'aka
  149.   return str
  150.  
  151.  
  152.  
  153. /* get an AXsh configuration value */
  154.  
  155. axconfig: procedure
  156.   tempfile = "T:axconfig." || pragma('Id')
  157.   rc_index  = "AXsh:rexx/rc.index"
  158.   var_val=""; var_file=""; var_defval="";
  159.  
  160.   parse upper arg var_name
  161.   if left(var_name,1) ~= '%' then var_name = '%'var_name
  162.   if right(var_name,1) ~= ':' then var_name = var_name':'
  163.  
  164.   if open('idx',rc_index,'Read') then do
  165.     do until (eof('idx') | (var_file~=''))
  166.       str= translate(readln('idx'),' ',d2c(9))
  167.       if words(str) > 0 then do
  168.         parse var str vname ' ' fname '"' defval '"'
  169.         if upper(vname) = var_name then do
  170.           var_file= strip(fname,'B',' 'd2c(9))
  171.           var_defval= defval
  172.           end
  173.         end
  174.       end
  175.     call close('idx')
  176.     end
  177.   else say 'Could not read "'rc_index'"'
  178.  
  179.   if words(var_file) > 0 then do
  180.     if open('rc',var_file,'Read') then do
  181.       do until (eof('rc') | (var_val~=''))
  182.         str= translate(readln('rc'),' ',d2c(9))
  183.         if upper(word(str,1)) = var_name then var_val = strip(readln('rc'),'B',' 'd2c(9))
  184.         end
  185.       call close('rc')
  186.       end
  187.     else say 'Could not examine "'var_file'" for' var_name
  188.     end
  189.   else do
  190.     if words(var_defval) > 0 then var_val= var_defval
  191.     else say 'No such config variable:' var_name
  192.     end
  193.  
  194.   return var_val
  195.  
  196.